﻿package book;

import java.io.IOException;
import java.sql.Connection;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement;
import java.util.ArrayList;
import java.util.regex.Matcher;
import java.util.regex.Pattern;

import javax.servlet.RequestDispatcher;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

public class EditServlet extends HttpServlet {

	int open_flag_orgnl = 0;

//=============【『書籍検索結果』画面より受けとったパラメータで『書籍情報変更』画面を表示】======

	public void doGet(HttpServletRequest request,HttpServletResponse response)
			throws ServletException, IOException {

//　入力パラメータの文字エンコーディング
		request.setCharacterEncoding("UTF-8");

//　入力パラメータを取得
//　変更するレコードをidで指定
		String id = request.getParameter( "id" );

//　SQL文を記述
		String sql = "SELECT * FROM books WHERE ID = " + id;

		Connection con = null;
		Statement smt = null;

		try{
//　データベースを接続するためのConnectionオブジェクトを取得
//　SQLを発行するためのStatementオブジェクトを取得
			con = common.DBManager.getConnection();
			smt = con.createStatement();

//　StatementオブジェクトのexecuteUpdate()メソッドでSQLを発行(検索)
			ResultSet rs = smt.executeQuery( sql );

			BookBean bean = new BookBean();
			while(rs.next()){
				bean.setId(rs.getInt("id"));
				bean.setTitle(rs.getString("title"));
				bean.setWriter(rs.getString("writer"));
				bean.setPublisherId(rs.getInt("publisher_id"));
				bean.setGenreId(rs.getInt("genre_id"));
				bean.setIsbn(rs.getString("isbn"));
				bean.setPublicationDate(rs.getString("publication_date"));
				bean.setOpenFlag(rs.getInt("open_flag"));
			//　公開フラグを保存(変更時の確認のため)
				open_flag_orgnl = rs.getInt("open_flag");
				bean.setContent(rs.getString("content"));
				bean.setPicture(rs.getString("picture"));
			}

		//　リクエストスコープに"引数1"という名前で引数2の文字列を登録
			request.setAttribute("bean", bean);

		}catch( SQLException e ){

			throw new ServletException( e );

		}finally{

			if( smt != null ){

				try{
					smt.close();
				}catch( SQLException ignore ){
					//　何もしない
				}
			}
			if( con != null ){

				try{
					con.close();
				}catch( SQLException ignore ){
					//　何もしない
				}
			}
		}

//　JSPに画面遷移、フォワード
		request.getRequestDispatcher( "/book/userBookEdit.jsp" ).forward(request, response);
	}


//=============【　正常処理　】『書籍情報変更』画面より受けとったパラメータで『書籍情報変更確認』画面を表示======
//=============【エラー発生時】『書籍情報変更』画面へ戻る======


	public void doPost(HttpServletRequest request,HttpServletResponse response)
			throws ServletException, IOException {

//　入力パラメータの文字エンコーディング
		request.setCharacterEncoding("UTF-8");

//　入力パラメータを取得
		String id = request.getParameter( "id" );
		String title = request.getParameter( "title" );
		String writer = request.getParameter( "writer" );
	//	String publisher_id = request.getParameter( "publisher_id" );
		String publisher = request.getParameter( "publisher" );
		String genre_id = request.getParameter( "genre_id" );
		String genre = request.getParameter( "genre" );
		String isbn = request.getParameter( "isbn" );
		String publication_date = request.getParameter( "publication_date" );
		String open_flag = request.getParameter( "open_flag" );
		String content = request.getParameter( "content" );
		String picture = request.getParameter( "picture" );


//　エラーメッセージを格納するArrayListの生成
		ArrayList<String> error_message = new ArrayList<String>();

//　エラーチェックのフラグ
		boolean error = false;

//　エラーのフィールドを赤く表示
		String error_title = null;
		String error_writer = null;
		String error_publisher = null;
		String error_genre = null;
		String error_isbn = null;
		String error_publication_date = null;
		String error_content = null;

//　遷移先のパス
		String path = null;

//----------【例外処理】----------

//　未入力の確認

		boolean genreN = false;
	//	boolean publisherF = false;

		if((title == null || title.equals("")) ||
				(writer == null || writer.equals("")) ||
				(publisher == null || publisher.equals("")) ||
		//		(publisher_id == null || publisher_id.equals("")) ||
				(genre == null || genre.equals("")) ||
				(isbn == null || isbn.equals("")) ||
				(publication_date == null || publication_date.equals("")) ||
				(content == null || content.equals(""))){

			error_message.add("すべての項目を入力してください");
			error = true;

			if(title == null || title.equals("")){

				error_title = "error";
			}
			if(writer == null || writer.equals("")){

				error_writer = "error";
			}
			if(publisher == null || publisher.equals("")){

				error_publisher = "error";
	//			request.setAttribute( "publisher_back" , "publisher_back" );
			}
	//		if(publisher_id == null || publisher_id.equals("")){
	//
	//			error_publisher = "error";
	//			request.setAttribute( "publisher_back" , "publisher_back" );
	//		}
			if(genre == null || genre.equals("")){

				error_genre = "error";
	//			request.setAttribute( "genre_back" , "genre_back" );
				genreN = true;
			}
			if(isbn == null || isbn.equals("")){

				error_isbn = "error";
			}
			if(publication_date == null || publication_date.equals("")){

				error_publication_date = "error";
			}
			if(content == null || content.equals("")){

				error_content = "error";
			}
		}
	//	else if(genre != null || !genre.equals("")){
	//		genreF = true;
	//	}
	//	else if(publisher != null || !publisher.equals("")){
	//		publisherF = true;
	//	}

//　文字制限・半角英数字の確認（isbn、publication_date）
		if(!Isbncheck(isbn)){
			error_message.add("ISBNコードは、半角で入力して下さい");
			error = true;
			error_isbn = "error";
		}

		//　入力パターンを登録します
		Pattern pattern_publication_date = Pattern.compile("^[0-9]{4}[-][0-9]{2}[-][0-9]{2}$");

		//　指定された入力とこのパターンをマッチする正規表現エンジンを作成
		Matcher matcher_publication_date = pattern_publication_date.matcher(publication_date);

		//　入力された値が正規表現とマッチしているか調べる
		//　正規表現のパターンとマッチした場合にのみ true
		//　matches メソッドは、入力シーケンス全体とパターンをマッチする

		if( !matcher_publication_date.matches() ){
			error_message.add("発行年月日は、半角で、かつ YYYY-MM-DD の形式で入力して下さい");
			error = true;
			error_publication_date = "error";
		}

//　予約中書籍は『公開』から『非公開』にできない
		int open_flag_num = Integer.parseInt(open_flag);
		if(open_flag_num != open_flag_orgnl){
			if(!Opencheck(isbn)){
				error_message.add("予約中書籍のため、『公開・非公開』は変更できません");
				error = true;
			}
		}


		if(!error){

//----------【例外なし正常処理】----------

			BookBean bean2 = new BookBean();
			bean2.setId(Integer.parseInt(id));
			bean2.setTitle(title);
			bean2.setWriter(writer);
		//	bean2.setPublisherId(Integer.parseInt(publisher_id));
			bean2.setGenreId(Integer.parseInt(genre));
			bean2.setIsbn(isbn);
			bean2.setPublicationDate(publication_date);
			bean2.setOpenFlag(Integer.parseInt(open_flag));
			bean2.setContent(content);
			bean2.setPicture(picture);

			request.setAttribute("bean", bean2);

			request.setAttribute( "publisher" , publisher );


			path = "/book/userBookEditCheck.jsp";

		}else{

//----------【例外処理】----------

			BookBean bean = new BookBean();
			bean.setId(Integer.parseInt(id));
			bean.setTitle(title);
			bean.setWriter(writer);
		//	bean.setPublisherId(Integer.parseInt(publisher_id));

//			if(error_publisher != null){
//				request.setAttribute( "publisher" , publisher );
//			}
//
			if(genreN){

			}else{
	//			bean.setGenreId(Integer.parseInt(genre_id));
				request.setAttribute( "genre_f" , "genre_f" );
				request.setAttribute( "genre" , "genre" );
			}
	//		bean.setGenreId(Integer.parseInt(genre_id));


			bean.setIsbn(isbn);
			bean.setPublicationDate(publication_date);
			bean.setOpenFlag(Integer.parseInt(open_flag));
			bean.setContent(content);
			bean.setPicture(picture);

			request.setAttribute("bean", bean);
			request.setAttribute( "publisher" , publisher );

			request.setAttribute( "publisher_back" , "publisher_back" );
			request.setAttribute( "genre_back" , "genre_back" );

			//　リクエストスコープに"引数1"という名前で引数2の文字列を登録
			request.setAttribute( "error_message" , error_message );
			request.setAttribute( "error_title" , error_title );
			request.setAttribute( "error_writer" , error_writer );
			request.setAttribute( "error_genre_id" , error_genre );
			request.setAttribute( "error_publisher" , error_publisher );
			request.setAttribute( "error_isbn" , error_isbn );
			request.setAttribute( "error_publication_date" , error_publication_date );
			request.setAttribute( "error_content" , error_content );

			path = "/book/userBookEdit.jsp";
		}

//　JSPに画面遷移、フォワード
		RequestDispatcher dispatcher = request.getRequestDispatcher( path );
		dispatcher.forward(request, response);
	}

//　isbnは半角英数字のみなのでそれ以外の時はNG
	private boolean Isbncheck(String isbn){

		boolean check = true;

		 char[] chars = isbn.toCharArray();
	    for (int i = 0; i < chars.length; i++) {
	         char c = chars[i];
	         if ((c <= '\u007e') || // 英数字
	        	                (c == '\u00a5') || // \記号
	        	                (c == '\u203e') || // ~記号
	        	               (c >= '\uff61' && c <= '\uff9f') // 半角カナ
	 	        ) {  } else {
	        	             check = false;
	        	             break ;
	         }
		}
		return check;
	}

//　予約中書籍は『公開』から『非公開』にできない

	Statement smt  = null;
	Connection con = null;

	private boolean Opencheck(String isbn){
		boolean check = true;

		//　入力された利用者IDと同じIDのものを検索する
		String sql = "select count(*) as cnt from reserves where BOOK_ISBN = '"+ isbn + "'";

		try {

			con = common.DBManager.getConnection();
			smt  = con.createStatement();

			ResultSet rs   = smt.executeQuery(sql);

			if(rs.next()){
				int coung = rs.getInt("cnt");
				if(coung > 0)
				check = false;
			}

		}catch (SQLException e){

		}finally{
			if(smt != null){try{smt.close();}catch(SQLException ignore){}}
			if(con != null){try{con.close();}catch(SQLException ignore){}}
		}
		return check;
	}
}
